package com.easy.frame.servers.sys.service.menu;

import com.easy.frame.base.api.pojo.PageDTO;
import com.easy.frame.base.api.pojo.PageVO;
import com.easy.frame.base.basic.pojo.vo.BaseTreeVO;
import com.easy.frame.base.service.tree.TreeService;
import com.easy.frame.servers.sys.dto.SysMenuPageDTO;
import com.easy.frame.servers.sys.entity.SysMenu;
import com.easy.frame.servers.sys.entity.SysSetting;
import com.easy.frame.servers.sys.entity.SysTenantMenu;
import com.easy.frame.servers.sys.vo.SysMenuPageVO;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 系统菜单表 服务类
 * </p>
 *
 * @author zzf
 * @since 2020-12-14
 */
public interface SysMenuService extends TreeService<SysMenu> {

    /**
     * 分页
     *
     * @param param 分页参数
     * @return 分页对象
     */
    PageVO<SysMenuPageVO> selectForPage(PageDTO<SysMenuPageDTO> param);

    /**
     * 根据id进行查询
     *
     * @param id
     */
    SysMenu selectById(Long id);

    /**
     * 根据id进行统计
     *
     * @param id
     */
    int countById(Long id);

    /**
     * 软删除的方式更新delete状态
     *
     * @param id
     */
    int updateDeleted(Long id);

    /**
     * 给租户授权菜单
     *
     * @param tenantId             租户id
     * @param menuId2OptionListMap 菜单id：操作集合 map
     */
    void authTenant(Long tenantId, Map<Long, List<String>> menuId2OptionListMap);

    /**
     * 给指定角色授权菜单
     *
     * @param roleId               角色id
     * @param menuId2OptionListMap 菜单id：操作集合 map
     * @param isSyncChangeStaff    是否同步修改角色下的用户菜单信息
     */
    void authRole(Long roleId, Map<Long, List<String>> menuId2OptionListMap, boolean isSyncChangeStaff);

    /**
     * 给指定员工授权菜单
     *
     * @param staffId              员工id
     * @param menuId2OptionListMap 菜单id：操作集合 map
     */
    void authStaff(Long staffId, Map<Long, List<String>> menuId2OptionListMap);

    /**
     * 给租户授权菜单
     *
     * @param tenantId             租户id
     * @param menuId2OptionListMap 菜单id：操作集合 map
     * @param currentUserId        当前用户id
     */
    void authTenantAsync(Long tenantId, Map<Long, List<String>> menuId2OptionListMap, Long currentUserId);

    /**
     * 异步给指定角色集合授权菜单
     *
     * @param roleIdList           角色id集合
     * @param menuId2OptionListMap 菜单id：操作集合 map
     * @param isSyncChangeStaff    是否同步修改角色下的用户菜单信息
     * @param currentUserId        当前用户id
     */
    void authRoleAsync(List<Long> roleIdList, Map<Long, List<String>> menuId2OptionListMap, boolean isSyncChangeStaff, Long currentUserId);

    /**
     * 异步给指定员工集合授权菜单
     *
     * @param staffIdList          员工id集合
     * @param menuId2OptionListMap 菜单id：操作集合 map
     * @param currentUserId        当前用户id
     */
    void authStaffAsync(List<Long> staffIdList, Map<Long, List<String>> menuId2OptionListMap, Long currentUserId);

    List<SysSetting> selectMenuHead();

    void saveSetting(String navValue, String cssValue, String menuAddress);

    BaseTreeVO listTenant(Long tenantId);

    BaseTreeVO listRole(Long roleId);

    BaseTreeVO listStaff(Long staffId);

    void addTenant(SysTenantMenu tenantMenu);

    List<SysMenu> menuSysList(Integer sysMenu);

    void updateEntityById(SysMenu entity);

    List<SysTenantMenu> getSysMenuById(Long tenantId);
}
